package cn.zqy.demo2.day06.ThreadSafe;

/**
 *  卖票案例出现了线程安全问题
 *     卖出了不存在的票和重复的票
 *
 *     解决线程安全问题的三种方案:使用Lock锁
 *     java.util.concurrent.locks.Lock接口
 *     Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。
 *     Lock接口中的方法:
 *         void lock()获取锁。
 *         void unlock()  释放锁。
 *     java.util.concurrent.locks.ReentrantLock implements Lock接口
 *
 *
 *     使用步骤:
 *         1.在成员位置创建一个ReentrantLock对象
 *         2.在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁
 *         3.在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁
 * */
public class Demo04TicketLock {
    public static void main(String[] args) {
        Runnable run = new TicketLockImpl();

        Thread t1 = new Thread(run);
        Thread t2 = new Thread(run);
        Thread t3 = new Thread(run);

        t1.start();
        t2.start();
        t3.start();
    }

}
